# ***** BEGIN GPL LICENSE BLOCK *****
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ***** END GPL LICENSE BLOCK *****

if(WIN32)
	option(ENABLE_MINGW64 "Enable building of ffmpeg/iconv/libsndfile/lapack/fftw3 by installing mingw64" ON)
endif()
option(WITH_WEBP "Enable building of oiio with webp support" OFF)
set(MAKE_THREADS 1 CACHE STRING "Number of threads to run make with")

if(NOT BUILD_MODE)
	set(BUILD_MODE "Release")
	message(STATUS "Build type not specified: defaulting to a release build.")
endif()
message("BuildMode = ${BUILD_MODE}")

if(BUILD_MODE STREQUAL "Debug")
	set(LIBDIR ${CMAKE_CURRENT_BINARY_DIR}/Debug)
else(BUILD_MODE STREQUAL "Debug")
	set(LIBDIR ${CMAKE_CURRENT_BINARY_DIR}/Release)
endif()

option(DOWNLOAD_DIR "Path for downloaded files" ${CMAKE_CURRENT_SOURCE_DIR}/downloads)
file(TO_CMAKE_PATH ${DOWNLOAD_DIR} DOWNLOAD_DIR)
set(PATCH_DIR ${CMAKE_CURRENT_SOURCE_DIR}/patches)
set(BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/build)

message("LIBDIR = ${LIBDIR}")
message("DOWNLOAD_DIR = ${DOWNLOAD_DIR}")
message("PATCH_DIR = ${PATCH_DIR}")
message("BUILD_DIR = ${BUILD_DIR}")

if(WIN32)
	if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
		set(PATCH_CMD ${DOWNLOAD_DIR}/mingw/mingw64/msys/1.0/bin/patch.exe)
	else()
		set(PATCH_CMD ${DOWNLOAD_DIR}/mingw/mingw32/msys/1.0/bin/patch.exe)
	endif()
	set(LIBEXT ".lib")
	set(LIBPREFIX "")

	# For OIIO and OSL
	set(COMMON_DEFINES /DPSAPI_VERSION=1 /DOIIO_STATIC_BUILD /DTINYFORMAT_ALLOW_WCHAR_STRINGS)

	if(MSVC_VERSION GREATER 1909)
		set(COMMON_MSVC_FLAGS "/Wv:18") #some deps with warnings as error aren't quite ready for dealing with the new 2017 warnings.
	endif()

	if(WITH_OPTIMIZED_DEBUG)
		set(BLENDER_CMAKE_C_FLAGS_DEBUG "/MTd ${COMMON_MSVC_FLAGS} /O2 /Ob2 /DNDEBUG /DPSAPI_VERSION=1 /DOIIO_STATIC_BUILD /DTINYFORMAT_ALLOW_WCHAR_STRINGS")
	else()
		set(BLENDER_CMAKE_C_FLAGS_DEBUG "/MTd ${COMMON_MSVC_FLAGS} /Zi /Ob0 /Od /RTC1 /D_DEBUG /DPSAPI_VERSION=1 /DOIIO_STATIC_BUILD /DTINYFORMAT_ALLOW_WCHAR_STRINGS")
	endif()
	set(BLENDER_CMAKE_C_FLAGS_MINSIZEREL "/MT ${COMMON_MSVC_FLAGS} /O1 /Ob1 /D NDEBUG /DPSAPI_VERSION=1 /DOIIO_STATIC_BUILD /DTINYFORMAT_ALLOW_WCHAR_STRINGS")
	set(BLENDER_CMAKE_C_FLAGS_RELEASE "/MT ${COMMON_MSVC_FLAGS} /O2 /Ob2 /DNDEBUG /DPSAPI_VERSION=1 /DOIIO_STATIC_BUILD /DTINYFORMAT_ALLOW_WCHAR_STRINGS")
	set(BLENDER_CMAKE_C_FLAGS_RELWITHDEBINFO "/MT ${COMMON_MSVC_FLAGS} /Zi /O2 /Ob1 /D NDEBUG /DPSAPI_VERSION=1 /DOIIO_STATIC_BUILD /DTINYFORMAT_ALLOW_WCHAR_STRINGS")

	if(WITH_OPTIMIZED_DEBUG)
		set(BLENDER_CMAKE_CXX_FLAGS_DEBUG "/MTd ${COMMON_MSVC_FLAGS} /O2 /Ob2 /D NDEBUG /D PLATFORM_WINDOWS /DPSAPI_VERSION=1 /DOIIO_STATIC_BUILD /DTINYFORMAT_ALLOW_WCHAR_STRINGS")
	else()
		set(BLENDER_CMAKE_CXX_FLAGS_DEBUG "/D_DEBUG /D PLATFORM_WINDOWS /MTd  ${COMMON_MSVC_FLAGS} /Zi /Ob0 /Od /RTC1 /DPSAPI_VERSION=1 /DOIIO_STATIC_BUILD /DTINYFORMAT_ALLOW_WCHAR_STRINGS")
	endif()
	set(BLENDER_CMAKE_CXX_FLAGS_MINSIZEREL "/MT /${COMMON_MSVC_FLAGS} /O1 /Ob1 /D NDEBUG  /D PLATFORM_WINDOWS /DPSAPI_VERSION=1 /DOIIO_STATIC_BUILD /DTINYFORMAT_ALLOW_WCHAR_STRINGS")
	set(BLENDER_CMAKE_CXX_FLAGS_RELEASE "/MT ${COMMON_MSVC_FLAGS} /O2 /Ob2 /D NDEBUG /D PLATFORM_WINDOWS /DPSAPI_VERSION=1 /DOIIO_STATIC_BUILD /DTINYFORMAT_ALLOW_WCHAR_STRINGS")
	set(BLENDER_CMAKE_CXX_FLAGS_RELWITHDEBINFO "/MT ${COMMON_MSVC_FLAGS} /Zi /O2 /Ob1 /D NDEBUG /D PLATFORM_WINDOWS /DPSAPI_VERSION=1 /DOIIO_STATIC_BUILD /DTINYFORMAT_ALLOW_WCHAR_STRINGS")

	set(PLATFORM_FLAGS)
	set(PLATFORM_CXX_FLAGS)
	set(PLATFORM_CMAKE_FLAGS)

	if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
		set(MINGW_PATH ${DOWNLOAD_DIR}/mingw/mingw64)
		set(MINGW_SHELL ming64sh.cmd)
		set(PERL_SHELL ${DOWNLOAD_DIR}/perl/portableshell.bat)
		set(MINGW_HOST x86_64-w64-mingw32)
	else()
		set(MINGW_PATH ${DOWNLOAD_DIR}/mingw/mingw32)
		set(MINGW_SHELL ming32sh.cmd)
		set(PERL_SHELL ${DOWNLOAD_DIR}/perl32/portableshell.bat)
		set(MINGW_HOST i686-w64-mingw32)
	endif()

	set(CONFIGURE_ENV
		cd ${MINGW_PATH} &&
		call ${MINGW_SHELL} &&
		call ${PERL_SHELL} &&
		set path &&
		set CFLAGS=-g &&
		set LDFLAGS=-Wl,--as-needed -static-libgcc
	)

	set(CONFIGURE_ENV_NO_PERL
		cd ${MINGW_PATH} &&
		call ${MINGW_SHELL} &&
		set path &&
		set CFLAGS=-g &&
		set LDFLAGS=-Wl,--as-needed -static-libgcc
	)

	set(CONFIGURE_COMMAND sh ./configure)
	set(CONFIGURE_COMMAND_NO_TARGET ${CONFIGURE_COMMAND})
else()
	set(PATCH_CMD patch)
	set(LIBEXT ".a")
	set(LIBPREFIX "lib")

	if(APPLE)
		# Let's get the current Xcode dir, to support xcode-select
		execute_process(
			COMMAND xcode-select --print-path
			OUTPUT_VARIABLE XCODE_DEV_PATH OUTPUT_STRIP_TRAILING_WHITESPACE
		)
		set(OSX_ARCHITECTURES x86_64)
		set(OSX_DEPLOYMENT_TARGET 10.9)
		set(OSX_SDK_VERSION 10.12)
		set(OSX_SYSROOT ${XCODE_DEV_PATH}/Platforms/MacOSX.platform/Developer/SDKs/MacOSX${OSX_SDK_VERSION}.sdk)

		set(PLATFORM_CFLAGS "-isysroot ${OSX_SYSROOT} -mmacosx-version-min=${OSX_DEPLOYMENT_TARGET}")
		set(PLATFORM_CXXFLAGS "-isysroot ${OSX_SYSROOT} -mmacosx-version-min=${OSX_DEPLOYMENT_TARGET} -std=c++11 -stdlib=libc++")
		set(PLATFORM_LDFLAGS "-isysroot ${OSX_SYSROOT} -mmacosx-version-min=${OSX_DEPLOYMENT_TARGET}")
		set(PLATFORM_BUILD_TARGET --build=x86_64-apple-darwin13.0.0) # OS X 10.9
		set(PLATFORM_CMAKE_FLAGS
			-DCMAKE_OSX_ARCHITECTURES:STRING=${OSX_ARCHITECTURES}
			-DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${OSX_DEPLOYMENT_TARGET}
			-DCMAKE_OSX_SYSROOT:PATH=${OSX_SYSROOT}
		)
	else()
		set(PLATFORM_CFLAGS "-fPIC")
		set(PLATFORM_CXXFLAGS "-std=c++11 -fPIC")
		set(PLATFORM_LDFLAGS)
		set(PLATFORM_BUILD_TARGET)
		set(PLATFORM_CMAKE_FLAGS)
	endif()

	if(WITH_OPTIMIZED_DEBUG)
		set(BLENDER_CMAKE_C_FLAGS_DEBUG "-O2 -DNDEBUG")
	else()
		set(BLENDER_CMAKE_C_FLAGS_DEBUG "-g")
	endif()
	set(BLENDER_CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG")
	set(BLENDER_CMAKE_C_FLAGS_RELEASE "-O2 -DNDEBUG")
	set(BLENDER_CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g -DNDEBUG")

	if(WITH_OPTIMIZED_DEBUG)
		set(BLENDER_CMAKE_CXX_FLAGS_DEBUG "-O2 -DNDEBUG ${PLATFORM_CXXFLAGS}")
	else()
		set(BLENDER_CMAKE_CXX_FLAGS_DEBUG "-g ${PLATFORM_CXXFLAGS}")
	endif()

	set(BLENDER_CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG ${PLATFORM_CXXFLAGS}")
	set(BLENDER_CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG ${PLATFORM_CXXFLAGS}")
	set(BLENDER_CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -DNDEBUG ${PLATFORM_CXXFLAGS}")

	set(CONFIGURE_ENV
		export MACOSX_DEPLOYMENT_TARGET=${OSX_DEPLOYMENT_TARGET} &&
		export CFLAGS=${PLATFORM_CFLAGS} &&
		export CXXFLAGS=${PLATFORM_CXXFLAGS} &&
		export LDFLAGS=${PLATFORM_LDFLAGS}
	)
	set(CONFIGURE_ENV_NO_PERL ${CONFIGURE_ENV})
	set(CONFIGURE_COMMAND ./configure ${PLATFORM_BUILD_TARGET})
	set(CONFIGURE_COMMAND_NO_TARGET ./configure)
endif()

set(DEFAULT_CMAKE_FLAGS
	-DCMAKE_BUILD_TYPE=${BUILD_MODE}
	-DCMAKE_C_FLAGS_DEBUG=${BLENDER_CMAKE_C_FLAGS_DEBUG}
	-DCMAKE_C_FLAGS_MINSIZEREL=${BLENDER_CMAKE_C_FLAGS_MINSIZEREL}
	-DCMAKE_C_FLAGS_RELEASE=${BLENDER_CMAKE_C_FLAGS_RELEASE}
	-DCMAKE_C_FLAGS_RELWITHDEBINFO=${BLENDER_CMAKE_C_FLAGS_RELWITHDEBINFO}
	-DCMAKE_CXX_FLAGS_DEBUG=${BLENDER_CMAKE_CXX_FLAGS_DEBUG}
	-DCMAKE_CXX_FLAGS_MINSIZEREL=${BLENDER_CMAKE_CXX_FLAGS_MINSIZEREL}
	-DCMAKE_CXX_FLAGS_RELEASE=${BLENDER_CMAKE_CXX_FLAGS_RELEASE}
	-DCMAKE_CXX_FLAGS_RELWITHDEBINFO=${CMAKE_CXX_FLAGS_RELWITHDEBINFO}
	${PLATFORM_CMAKE_FLAGS}
)

if(WIN32)
	#we need both flavors to build the thumbnail dlls
	if(MSVC12)
		set(GENERATOR_32 "Visual Studio 12 2013")
		set(GENERATOR_64 "Visual Studio 12 2013 Win64")
	elseif(MSVC14)
		set(GENERATOR_32 "Visual Studio 14 2015")
		set(GENERATOR_64 "Visual Studio 14 2015 Win64")
	endif()
endif()


if(WIN32)
	set(ZLIB_LIBRARY zlibstatic${LIBEXT})
else()
	set(ZLIB_LIBRARY libz${LIBEXT})
endif()

if(MSVC)
	set_property(GLOBAL PROPERTY USE_FOLDERS ON)
endif()

set(CMAKE_INSTALL_MESSAGE LAZY)
